package com.briup.smartcity_group6.service.Impl;


import com.briup.smartcity_group6.bean.basic.BaseUser;
import com.briup.smartcity_group6.dao.basic.ArticleMapper;
import com.briup.smartcity_group6.dao.basic.BaseUserMapper;
import com.briup.smartcity_group6.dao.ext.BaseUserExtMapper;
import com.briup.smartcity_group6.exception.ServiceException;
import com.briup.smartcity_group6.service.IBaseUserService;
import com.briup.smartcity_group6.utils.ConstantValue;
import com.briup.smartcity_group6.utils.JwtUtil;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Slf4j
@Service
public class BaseUserServiceImpl implements IBaseUserService {
    @Autowired
    private BaseUserMapper mapper;//逆向工程生成的映射器对象 基本CURD
    @Autowired
    private BaseUserExtMapper extMapper;//扩展映射器 新增CURD
    @Autowired
    private ArticleMapper articleMapper;

    public String login(String username, String password) {
        /*
          不同实现： 1.3个if可以转换为if else
          代码优化：
            1.将系统的返回结果字符串封装ResultCode枚举对象，统一管理
            2.将 ServiceException类提供有参构造器 ServiceException(ResultCode code)
            3.将系统中使用数字，字符串表示信息设置为常量信息
              创建一个接口 定义静态常量
        */
        //1.判断用户名是否存在的问题
        BaseUser baseUser = extMapper.selectByName(username);

        if(baseUser == null){
            throw new ServiceException("用户名不存在");
        }
        //2.比较参数中密码信息与数据库中密码是否相同
         else if(!password.equals(baseUser.getPassword())){
            throw new ServiceException("密码错误");
        }
        //3.判断用户的状态是否为锁定状态？ status!=0
      else if(baseUser.getStatus() == ConstantValue.ERROR_STATUS){
            throw new ServiceException("账号锁定");
        }
      else { }
        //4通过上面的逻辑判断，用户通过验证，可以实现登录操作，返回jwt字符串
        Map<String,Object> userInfo = new HashMap();
        //根据后面编写代码功能，决定存储用户什么信息到浏览器
        userInfo.put("username",baseUser.getUsername());
        //... 根据日志功能，需要提供用户真实名字
        String token = JwtUtil.sign(baseUser.getUsername(), userInfo);

        return token;
    }
    //获取当前用户的信息
    public BaseUser currentUserInfo(String token) {
        String userId = JwtUtil.getUserId(token);
        BaseUser baseUser=extMapper.selectByName(userId);
        return baseUser;
    }

    public void addUser(BaseUser baseUser) {
        log.info(baseUser.toString());
        //userId 如何生成？可以通过数据库的主键自增生成,默认userId=null
        //userId 可以手动使用工具类生成一段不重复唯一的字符串 java.util.UUID
        // 自定义工具类,生成id:订单号：（唯一）202301021830083742632 时间+用户id+商品id+xxx
        baseUser.setRegisterTime(new Date());
        baseUser.setStatus(ConstantValue.NORMAL_STATUS);//默认正常状态
        baseUser.setRole(ConstantValue.NORMAL_STATUS);//默认权限值(管理员)
        //当新增数据时，我们的数据满足数据库的 唯一约束 非空约束 ....
        //数据库中设置了用户注册的手机号信息唯一约束。
        BaseUser user = extMapper.selectByPhone(baseUser.getTelephone());
        if (user != null){
            throw new ServiceException("手机号已被注册");
        }
        /*
            添加其他信息唯一判断提示用户 用户名username重复
            用户的username是唯一的
            添加逻辑实现判断密码 是否是不安全密码：位数小于6位 是否包含大小写
            是否包含.( @ 数字
         */
        //密码是否符号条件
        String passwd= baseUser.getPassword();
        char []str2=passwd.toCharArray();
        char[] str1={'@','#','!','%','*','$','~'};
        int p=0;
        int M=0;
        int x=0;
        int u=0;
        int w=0;
        for (int i = 0; i < str2.length ; i++) {
            //判断小写字母
            if (Character.isLowerCase(str2[i])){
                x=1;
                continue;
            }
            //判断大写字母
            if (Character.isUpperCase(str2[i])){
                M=1;
                continue;
            }
            //判断数字
            if ((int)str2[i]<=57&&(int)str2[i]>=48)
                u=1;
            for (int j = 0; j < str1.length; j++) {
                //判断特殊字符
                if (str2[i]==str1[j])
                    p=1;
            }
            if (str2.length>7)
                w=1;
        }
        if (p+x+M+u+w<=1)
            throw new ServiceException("密码不符合要求");
        mapper.insert(baseUser);
    }

    @Override
    public PageInfo<BaseUser> pageQuery(int pageNum, int pageSize, String username, Integer role) {
        List<BaseUser> list= extMapper.findByUnameAndRole(username,role);
        //设置分页信息
        PageHelper.startPage(pageNum,pageSize,true);
        //执行分页查询
        PageInfo<BaseUser> pageInfo=new PageInfo<>(list);
        return pageInfo;
    }

    @Override
    public void upDate(Integer id, String telephone, String realname, Integer gender, String dob, String email) {
        extMapper.upDate(id,telephone,realname,gender,dob,email);
    }


    @Override
    public void updateUserIcon(int id, String alterUserIcon) {
        extMapper.updateIconById(id,alterUserIcon);

    }

    //当删除用户不存在时，删除失败，提示用户已经不存在
    //当删除用户为管理员时删除失败，，提示管理员不能删除，或者可以进行逻辑删除，也是就是将用户的状态设置为 禁用状态 status=1
    //当删除用户时，如果用户已经发布了咨询信息，需要将对应的咨询信息删除
    public void deleteById(Integer id) {
        if (null==mapper.selectByPrimaryKey(id)){
            throw new ServiceException("用户不存在");
        }
        if (extMapper.findRoleById(id)==0)
            throw new ServiceException("管理员不能删除");

    articleMapper.deleteByPrimaryKey(id);
    mapper.deleteByPrimaryKey(id);

    }
}
